<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
    <script>
      // 正则类原型上的方法
      // - test: 匹配
      // - exec：捕获

      // 字符串原型上的方法(这三个方法都可以实现捕获)
        // - replace
        // - match
        // - matchAll
        // 。。。

        
      /* 
      正则的捕获
      exec
        1、返回值是一个数组(如果捕获不到内容就是null)
          1、第一项是当前捕获的内容
          2、index是当前捕获到的内容位置的索引
          3、input：源字符串
        2、exec默认只能第一次符合规则的内容(这是正则的懒惰型，但是修饰符g可以消除正则的懒惰型)
      
       */

      //  let str = 'qw123ert456yuio789p';
      //  let reg = /\d{3}/g;
      // 如果正则不加g，那每一次去捕获，只能捕获到第一次符合规则的内容,当前正则身上的lastIndex都是0，(lastIndex是每一次正则匹配开始的位置)
       // 不加g的情况
      //  console.dir(reg.lastIndex); // 0
      //  console.log(reg.exec(str)); // ['123']
      //  console.dir(reg.lastIndex); // 0
      //  console.log(reg.exec(str)); // ['123']
      //  console.dir(reg.lastIndex); // 0
      //  console.log(reg.exec(str)); // ['123']
       // ["123", index: 2, input: "qw123ert456yuio789p", groups: undefined]

      

      // 加g的情况
      //  console.log(reg.lastIndex); // 0
      //  console.log(reg.exec(str));  // ['123']
      //  console.log(reg.lastIndex); // 5
      //  console.log(reg.exec(str));  // ['456']
      //  console.log(reg.lastIndex); // 11
      //  console.log(reg.exec(str));  // ['789']
      //  console.log(reg.lastIndex); // 18
      //  console.log(reg.exec(str));  // null
      //  console.log(reg.lastIndex); // 0
      //  console.log(reg.exec(str));  // ['123']  跟第一次一样了，就实现循环了
       // 如果正则加上g，那每捕获一次，正则的lastIndex就会记录当前捕获到的内容的最后一项索引的值，当下一次再继续捕获的时候，会从上一次记录的索引的基础上加1进行捕获，
      //  直到捕获到null为止，在继续从头进行捕获



      // reg.lastIndex = 5; // 如果正则加上g，就可手动改变lastIndex的值，从而改变捕获的位置
      // console.log(reg.exec(str));

//-----------------------------------------------------------------------------------------
// 由于正则没有直接获取所有符合规则的内容的方法，咱们要自己封装一个类似的方法
      let str = 'qw123ert456yuio789p';
       let reg = /\d{4}/g;
      //  console.log(reg.test(str));
      // console.dir(reg)

      function myExec(str){
        // 如果当前正则没有加修饰符g，把正则身上的global属性的值是false，如果加上了，那就是true
        if(!this.global){
          // 把第一次捕获到的内容return出去就行了，
          return this.exec(str); // 就是为了和原生的exec的返回值保持一致，并且阻止代码向下运行
        };
        let ary = []; // 创建一个数组，用来存储每一次捕获到的内容
        let res = this.exec(str); // ['123']
        while(res){
            ary.push(res[0]); // 把捕获到的内容push到ary数组中
            res = this.exec(str); // 继续捕获，把捕获到的新内容在赋值给res，直到捕获到null为止，就停止循环(因为捕获到null说明已经捕获到底了)
        };
        return ary.length === 0? null:ary;
        // 如果ary的length是0，说明当前正则一次也没有捕获到，那这时候应该return null
      };
      RegExp.prototype.myExec = myExec;
      console.log(reg.myExec(str)); // ['123','456','789']
      console.log(str.match(reg));
    </script>
</body>
</html>